static gboolean
selinux_relabel_var_if_needed (OstreeSysroot *sysroot,
OstreeSePolicy *sepolicy,
- OstreeDeployment *deployment,
+ int os_deploy_dfd,
GCancellable *cancellable,
GError **error)
{
- const char *osdeploypath = glnx_strjoina ("ostree/deploy/", ostree_deployment_get_osname (deployment));
- glnx_autofd int os_deploy_dfd = -1;
- if (!glnx_opendirat (sysroot->sysroot_fd, osdeploypath, TRUE, &os_deploy_dfd, error))
- return FALSE;
-
/* This is a bit of a hack; we should change the code at some
* point in the distant future to only create (and label) /var
* when doing a deployment.
return FALSE;
}
+ const char *osdeploypath = glnx_strjoina ("ostree/deploy/", ostree_deployment_get_osname (deployment));
+ glnx_autofd int os_deploy_dfd = -1;
+ if (!glnx_opendirat (self->sysroot_fd, osdeploypath, TRUE, &os_deploy_dfd, error))
+ return FALSE;
+
+ /* Ensure that the new deployment does not have /etc/.updated or
+ * /var/.updated so that systemd ConditionNeedsUpdate=/etc|/var services run
+ * after rebooting.
+ */
+ if (!ot_ensure_unlinked_at (deployment_dfd, "etc/.updated", error))
+ return FALSE;
+ if (!ot_ensure_unlinked_at (os_deploy_dfd, "var/.updated", error))
+ return FALSE;
+
g_autoptr(OstreeSePolicy) sepolicy = ostree_sepolicy_new_at (deployment_dfd, cancellable, error);
if (!sepolicy)
return FALSE;
- if (!selinux_relabel_var_if_needed (self, sepolicy, deployment, cancellable, error))
+ if (!selinux_relabel_var_if_needed (self, sepolicy, os_deploy_dfd, cancellable, error))
return FALSE;
/* Rewrite the origin using the final merged selinux config, just to be
--- /dev/null
+#!/bin/bash
+#
+# Copyright (C) 2014 Colin Walters <walters@verbum.org>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+set -euo pipefail
+
+. $(dirname $0)/libtest.sh
+
+# Exports OSTREE_SYSROOT so --sysroot not needed.
+setup_os_repository "archive-z2" "syslinux"
+
+echo "1..2"
+
+# Setup a deployment
+cd ${test_tmpdir}
+${CMD_PREFIX} ostree --repo=sysroot/ostree/repo remote add --set=gpg-verify=false testos $(cat httpd-address)/ostree/testos-repo
+${CMD_PREFIX} ostree --repo=sysroot/ostree/repo pull testos testos/buildmaster/x86_64-runtime
+rev=$(${CMD_PREFIX} ostree --repo=sysroot/ostree/repo rev-parse testos/buildmaster/x86_64-runtime)
+${CMD_PREFIX} ostree admin deploy --os=testos testos:testos/buildmaster/x86_64-runtime
+assert_has_dir sysroot/ostree/deploy/testos/deploy/${rev}.0/usr
+assert_has_dir sysroot/ostree/deploy/testos/deploy/${rev}.0/etc
+assert_has_dir sysroot/ostree/deploy/testos/var
+assert_not_has_file sysroot/ostree/deploy/testos/deploy/${rev}.0/etc/.updated
+assert_not_has_file sysroot/ostree/deploy/testos/var/.updated
+
+echo "ok deploy"
+
+# Create the /etc/.updated and /var/.updated files with /usr modification time
+usr=sysroot/ostree/deploy/testos/deploy/${rev}.0/usr
+touch -r ${usr} sysroot/ostree/deploy/testos/deploy/${rev}.0/etc/.updated
+touch -r ${usr} sysroot/ostree/deploy/testos/var/.updated
+
+# Make a new commit, upgrade and ensure .updated files are gone in the
+# new deployment but /etc/.updated still exists in the previous
+# (current) deployment
+os_repository_new_commit
+${CMD_PREFIX} ostree admin upgrade --os=testos
+newrev=$(${CMD_PREFIX} ostree --repo=sysroot/ostree/repo rev-parse testos/buildmaster/x86_64-runtime)
+assert_not_has_file sysroot/ostree/deploy/testos/deploy/${newrev}.0/etc/.updated
+assert_not_has_file sysroot/ostree/deploy/testos/var/.updated
+assert_has_file sysroot/ostree/deploy/testos/deploy/${rev}.0/etc/.updated
+
+echo "ok .updated files removed"